#include <stdio.h>

typedef enum
{
	SOCKET_SET_BUF_SIZE_SEND = 0,
	SOCKET_SET_BUF_SIZE_RECV,
} SOCKET_SET_BUF_SIZE_E;

typedef struct
{
	int s32Fd;
	char as8RemoteIp[24];
	int s32RemotePort;
} SOCKET_CONNECT_S;

typedef int (*SocketServerTcpNewConnCb)(SOCKET_CONNECT_S);
typedef void *SOCKET_SRV_TCP_HANDLE;

/**
@brief 创建TCP服务
@param[in] ps8Ip, 服务IP地址
@param[in] u16Port 服务端口
@param[in] s32MaxConn 最大连接数
@param[in] fnNewConnCb 一个新连接来到时，执行的回调
@return 成功返回句柄，失败返回NULL
*/
SOCKET_SRV_TCP_HANDLE SocketTcpServerCreate(char *ps8Ip, unsigned short u16Port, int s32MaxConn, SocketServerTcpNewConnCb fnNewConnCb);
int SocketTcpServerDestroy(SOCKET_SRV_TCP_HANDLE hHandle);
int SocketTcpClientCreate(char *ps8ServerIp, int s32ServerPort, unsigned char timeOut);
int SocketTcpClientDestroy(int s32SocketFd);
int SocketTcpSend(int s32SocketFd, char *ps8Buf, int s32Len, int s32Timeout);

/**
* @brief tcp接收函数
* @param[in] s32SocketFd 句柄
* @param[out] ps8Buf 数据输出缓冲
* @param[in] s32Len 缓冲区大小
* @parma[in] s32Timeout 未用
* @return 返回0表示EINTR，EWOULDBLOCK，EAGAIN，返回<0表示出错，返回>0成功
*/
int SocketTcpRecvSync(int s32SocketFd, char *ps8Buf, int s32Len);

/*返回0表示EINTR，EWOULDBLOCK，EAGAIN，返回<-1表示出错，返回-2表示超时，返回>0成功*/
int SocketTcpRecvSelect(int s32SocketFd, char *ps8Buf, int s32Len, int s32Timeout);

int SocketTcpOptSetBufSize(int s32SocketFd, SOCKET_SET_BUF_SIZE_E eType, int s32Size);
